/*
 * Copyright (c) 2022-2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup Native_Bundle
 * @{
 *
 * @brief 提供查询应用包信息的功能，获取到的信息包含应用包名和应用指纹信息。
 *
 * @since 9
 */

/**
 * @file native_interface_bundle.h
 *
 * @brief 提供查询应用包信息的功能，获取到的信息包含应用包名和应用指纹信息。
 * @kit AbilityKit
 * @include <bundle/native_interface_bundle.h>
 * @library libbundle_ndk.z.so
 * @syscap SystemCapability.BundleManager.BundleFramework.Core
 * @since 9
 */
#ifndef FOUNDATION_APPEXECFWK_STANDARD_KITS_APPKIT_NATIVE_BUNDLE_INCLUDE_NATIVE_INTERFACE_BUNDLE_H
#define FOUNDATION_APPEXECFWK_STANDARD_KITS_APPKIT_NATIVE_BUNDLE_INCLUDE_NATIVE_INTERFACE_BUNDLE_H

#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @brief 应用包信息数据结构，包含应用包名和应用指纹信息。
 *
 * @since 9
 */
typedef struct OH_NativeBundle_ApplicationInfo
{
    /**
     * @brief 应用的包名。
     * @since 9
     */
    char* bundleName;
    /**
     * @brief 应用的指纹信息，由签名证书通过SHA-256算法计算哈希值生成。使用的签名证书发生变化时，该字段也会发生变化。
     * @since 9
     */
    char* fingerprint;
};

/**
 * @brief elementName信息。
 *
 * @since 13
 */
typedef struct OH_NativeBundle_ElementName {
    /**
     * @brief 应用的包名。
     */
    char* bundleName;
    /**
     * @brief 模块名。
     */
    char* moduleName;
    /**
     * @brief 组件名。
     */
    char* abilityName;
};

/**
 * @brief 元数据信息。
 *
 * @since 20
 */
typedef struct OH_NativeBundle_Metadata {
    /**
     * @brief 元数据名称。
     */
    char* name;
    /**
     * @brief 元数据值。
     */
    char* value;
    /**
     * @brief 元数据资源。
     */
    char* resource;
} OH_NativeBundle_Metadata;

/**
 * @brief 模块元数据的信息。
 *
 * @since 20
 */
typedef struct OH_NativeBundle_ModuleMetadata {
    /**
     * @brief 模块名称。
     */
    char* moduleName;
    /**
     * @brief 模块的元数据数组。
     */
    OH_NativeBundle_Metadata* metadataArray;
    /**
     * @brief 模块的元数据数组大小。
     */
    size_t metadataArraySize;
} OH_NativeBundle_ModuleMetadata;

/**
 * @brief 应用信息。
 *
 * @since 11
 */
typedef struct OH_NativeBundle_ApplicationInfo OH_NativeBundle_ApplicationInfo;

/**
 * @brief elementName信息。
 *
 * @since 13
 */
typedef struct OH_NativeBundle_ElementName OH_NativeBundle_ElementName;

/**
 * @brief 获取当前应用信息，包含应用包名和应用指纹信息。
 *
 * @return 返回新创建的OH_NativeBundle_ApplicationInfo对象。如果返回的对象为NULL，则表示创建失败。
 * 失败的可能原因是应用程序地址空间已满，导致空间分配失败。
 * @since 9
 */
OH_NativeBundle_ApplicationInfo OH_NativeBundle_GetCurrentApplicationInfo();

/**
 * @brief 获取当前应用的appId。appId是应用的唯一标识，由应用包名和签名信息决定。
 * 在使用此接口后，为了避免内存泄漏，需要手动释放接口返回的指针。
 *
 * @return 返回一个新创建的字符串，用于指示appId信息。如果返回的对象为NULL，则表示创建失败。
 * 失败的可能原因是应用程序地址空间已满，导致内存分配失败。
 * @since 11
 */
char* OH_NativeBundle_GetAppId();

/**
 * @brief 获取当前应用的应用程序标识符。
 * 该应用程序标识符在应用的整个生命周期中不会发生变化，包括版本更新、证书更改、公钥和私钥更改以及应用程序迁移。
 * 在使用此接口后，为了避免内存泄漏，需要手动释放接口返回的指针。
 *
 * @return 返回一个新创建的字符串，用于指示应用程序标识符信息。如果返回的对象为 NULL，则表示创建失败。
 * 失败的可能原因是应用程序的地址空间已满，导致内存分配失败。
 * @since 11
 */
char* OH_NativeBundle_GetAppIdentifier();

/**
 * @brief 获取当前应用入口元素mainElement的信息，包括包名、模块名和能力名。
 * 在使用此接口后，为防止内存泄漏，需要手动释放接口返回的指针。
 *
 * @return 返回新创建的OH_NativeBundle_ElementName对象。如果返回的对象为NULL，则表示创建失败。
 * 失败的可能原因是应用程序地址空间已满，导致空间分配失败。
 * @since 13
 */
OH_NativeBundle_ElementName OH_NativeBundle_GetMainElementName();

/**
 * @brief 获取当前应用适用的设备类型。在使用此接口后，为了避免内存泄漏，需要手动释放接口返回的指针。
 *
 * @return 返回一个新创建的字符串，用于指示兼容设备类型。如果返回的对象为NULL，则表示创建失败。
 * 失败的可能原因是应用程序地址空间已满，导致内存分配失败。
 * @since 14
 */
char* OH_NativeBundle_GetCompatibleDeviceType();

/**
 * @brief 查询当前应用的调试模式。
 *
 * @param isDebugMode 表示应用是否处于调试模式，取值为true表示可调试模式，取值为false表示不可调试模式。
 * @return 如果调用成功，则返回true，否则返回false。
 * @since 20
 */
bool OH_NativeBundle_IsDebugMode(bool* isDebugMode);

/**
 * @brief 获取当前应用程序的模块元数据数组。
 * 在使用该接口之后，为了防止内存泄漏，需要手动释放接口返回的指针。
 *
 * @param size 表示模块元数据数组大小。
 * @return 返回模块元数据数组，如果返回的对象为NULL，则表示获取失败。
 * 失败的可能原因是应用程序地址空间已满，导致空间分配失败。
 * @since 20
 */
OH_NativeBundle_ModuleMetadata* OH_NativeBundle_GetModuleMetadata(size_t* size);
#ifdef __cplusplus
};
#endif
#endif // FOUNDATION_APPEXECFWK_STANDARD_KITS_APPKIT_NATIVE_BUNDLE_INCLUDE_NATIVE_INTERFACE_BUNDLE_H